﻿//using SEC.Controllers;
//using SEC.Models;
//using SEC.Models.Attributes;
//using SEC.SupportClasses;
//using SEC.SupportClasses.Excel;
//using SEC.SupportClasses.ExtJS;
//using SEC.ViewModels;
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.ComponentModel.DataAnnotations;
//using System.Linq;
//using System.Linq.Expressions;
//using System.Reflection;
//using System.Text;
//using System.Text.RegularExpressions;
//using System.Web;
//using System.Web.Mvc;
//using System.Web.Mvc.Html;

//namespace DotNet.Utilities.CodeArt框架帮助类
//{
//    public enum ButtonTypesEnum { Button, Link };
//    public enum ButtonOperationEnum { Submit, Button };
//    public enum UploadTypesEnum { 所有文件, 图片文件, Zip文件, Excel文件, Word文件, PDF文件, 文本文件, 自定义 }
//    public enum DateTimeTypeEnum { Date, Time, DateAndTime, Month };

//    /// <summary>
//    /// ExtJs相关的Html扩展帮助函数
//    /// </summary>
//    public static class ExtjsExtension
//    {
//        /// <summary>
//        /// 开始一个Extjs表单
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="url">表单提交的地址，null表示仍然提交到当前url</param>
//        /// <param name="id">表单ID</param>
//        /// <param name="width">表单宽度</param>
//        /// <param name="height">表单高度</param>
//        /// <param name="isRoot">是否为最上层控件</param>
//        /// <param name="frame">是否显示表单外边框</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <returns>ExtForm</returns>
//        public static ExtForm BeginForm<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string url = null, object routeValues = null, string id = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool isRoot = true, bool frame = false, int labelWidth = 80, int? flex = null)
//        {
//            string script = "";
//            var vm = html.InnerHelper.ViewData.Model as BaseVM;
//            string modelError = Utils.GetPropertyErrors(html.InnerHelper, "");
//            var debuglist = html.InnerHelper.ViewData.ModelState.Where(x => x.Key != "" && x.Value.Errors.Count() > 0).SelectMany(x => x.Value.Errors).ToList();
//            string debugError = "[" + debuglist.ToSpratedString(x => x, (x) => { return "'" + (x.ErrorMessage == "" ? x.Exception.Message : x.ErrorMessage).Replace("'", "\\\'") + "'"; }) + "]";
//            if (isRoot == true)
//            {
//                script += "<script>Ext.getCmp('" + vm.ViewDivID + @"').add(";
//            }
//            //拼接Extjs script
//            script += @" 
//    Ext.create('Ext.form.Panel', {
//          layout : { type : 'vbox', align : 'stretch'},
//          fieldDefaults: {
//            labelAlign: 'right',
//            msgTarget: 'side',
//           labelWidth: " + labelWidth + @"
//          },   
//        bodyPadding: 5,
//        margin: '0 0 5 0',
//        autoScroll:true,
//        border: false,
//        defaultType: 'textfield',
//        listeners: {
//            afterrender: function(self) {
//        ";
//            if (modelError != "")
//            {
//                script += @" self.add({
//                xtype: 'component',
//                id: '" + vm.UniqueID + "debugerror" + @"',
//                invalidCls: Ext.baseCSSPrefix + 'form-invalid-icon',
//                validCls: Ext.baseCSSPrefix + 'dd-drop-icon',
//                baseCls: 'form-error-state',
//                validText: '" + Resources.Language.表单存在错误 + @"',
//                invalidText: '" + Resources.Language.表单存在错误 + @"',
//                tipTpl: Ext.create('Ext.XTemplate', '<ul class=\'' + Ext.plainListCls + '\'><tpl for=\'.\'><li>{.}</li></tpl></ul>'),
//                listeners: {
//                    afterrender: function(debug){
//                        debug.setErrors(" + modelError + @");
//                    }
//                },
//                getTip: function() {
//                    var tip = this.tip;
//                    if (!tip) {
//                        tip = this.tip = Ext.widget('tooltip', {
//                            target: this.el,
//                            minWidth: 200,
//                            autoHide: true,
//                            anchor: 'top',
//                            mouseOffset: [-11, -2],
//                            closable: true,
//                            constrainPosition: false
//                        });
//                        tip.show();
//                    }
//                    return tip;
//                },
//
//                setErrors: function(errors) {
//                    var me = this,
//                        tip = me.getTip();
//
//                    errors = Ext.Array.from(errors);
//
//                    // Update CSS class and tooltip content
//                    if (errors.length) {
//                        me.addCls(me.invalidCls);
//                        me.removeCls(me.validCls);
//                        me.update(me.invalidText);
//                        tip.update(me.tipTpl.apply(errors));
//                         tip.setDisabled(false);
//                        tip.hide();
//                   } else {
//                        me.addCls(me.validCls);
//                        me.removeCls(me.invalidCls);
//                        me.update(me.validText);
//                        tip.setDisabled(true);
//                        tip.hide();
//                    }
//                }
//            });";
//            }
//            if (BaseController.IsQuickDebug == true && debugError != "[]")
//            {
//                script += @" self.add({
//                xtype: 'component',
//                id: '" + vm.UniqueID + "debugerror" + @"',
//                invalidCls: Ext.baseCSSPrefix + 'form-invalid-icon',
//                validCls: Ext.baseCSSPrefix + 'dd-drop-icon',
//                baseCls: 'form-error-state',
//                validText: '" + Resources.Language.调试信息 + @"',
//                invalidText: '" + Resources.Language.调试信息 + @"',
//                tipTpl: Ext.create('Ext.XTemplate', '<ul class=\'' + Ext.plainListCls + '\'><tpl for=\'.\'><li>{.}</li></tpl></ul>'),
//                listeners: {
//                    afterrender: function(debug){
//                        debug.setErrors(" + debugError + @");
//                    }
//                },
//                getTip: function() {
//                    var tip = this.tip;
//                    if (!tip) {
//                        tip = this.tip = Ext.widget('tooltip', {
//                            target: this.el,
//                            minWidth: 200,
//                            autoHide: true,
//                            anchor: 'top',
//                            mouseOffset: [-11, -2],
//                            closable: true,
//                            constrainPosition: false
//                        });
//                        tip.show();
//                    }
//                    return tip;
//                },
//
//                setErrors: function(errors) {
//                    var me = this,
//                        tip = me.getTip();
//
//                    errors = Ext.Array.from(errors);
//
//                    // Update CSS class and tooltip content
//                    if (errors.length) {
//                        me.addCls(me.invalidCls);
//                        me.removeCls(me.validCls);
//                        me.update(me.invalidText);
//                        tip.update(me.tipTpl.apply(errors));
//                         tip.setDisabled(false);
//                        tip.hide();
//                   } else {
//                        me.addCls(me.validCls);
//                        me.removeCls(me.invalidCls);
//                        me.update(me.validText);
//                        tip.setDisabled(true);
//                        tip.hide();
//                    }
//                }
//            });";
//            }
//            script += @"
//                var input = self.down('textfield');
//                var btn = self.down('button[type=submit]');
//                input.focus(false,true);
//                var knav = new Ext.util.KeyNav({
//                    target: self.getEl(),
//                    enter: function(e)
//                        { 
//                            if(btn == undefined){
//                                var qs = 'button[id=Searchbtn" + vm.UniqueID + @"]';
//                                var uppanel = self.up('panel');
//                                if(uppanel != undefined){
//                                    btn = uppanel.down(qs);
//                                }
//                            }
//                            if(btn != undefined){ btn.fireEvent('click', btn);}
//                        },
//                    scope : self
//                });
//
//            }
//        },
//        ";
//            //如果未指定url，则获取本页的url
//            if (string.IsNullOrWhiteSpace(url))
//            {
//                UrlHelper h = new UrlHelper(html.InnerHelper.ViewContext.RequestContext);
//                url = h.Action(html.InnerHelper.ViewContext.RequestContext.RouteData.Values["action"].ToString(), html.InnerHelper.ViewContext.RequestContext.RouteData.Values["controller"].ToString(), routeValues);
//            }
//            script += "url: '" + url + "'," + Environment.NewLine;
//            if (!string.IsNullOrEmpty(id))
//            {
//                script += "id: '" + id + "'," + Environment.NewLine;
//            }
//            if (width.HasValue)
//            {
//                script += "width: " + width.Value + "," + Environment.NewLine;
//            }
//            if (height.HasValue)
//            {
//                script += "height: " + height.Value + "," + Environment.NewLine;
//            }
//            if (maxWidth.HasValue)
//            {
//                script += "maxWidth: " + maxWidth.Value + "," + Environment.NewLine;
//            }
//            if (maxHeight.HasValue)
//            {
//                script += "maxHeight: " + maxHeight.Value + "," + Environment.NewLine;
//            }
//            if (flex.HasValue)
//            {
//                script += "flex: " + flex.Value + "," + Environment.NewLine;
//            }
//            script += "frame: " + frame.ToString().ToLower() + "," + Environment.NewLine;
//            if (frame == false)
//            {
//                script += "bodyCssClass: 'x-panel-mc'," + Environment.NewLine;
//            }
//            //输出Div和Script，form将会被渲染在div中。 script并没有结束标记，是因为form后面还会拼接各种控件，直到最后using{}结束的时候才会拼上最后的</script>
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            //返回ExtForm
//            ExtForm rv = new ExtForm(html.InnerHelper.ViewContext);
//            rv.IsRoot = isRoot;
//            return rv;
//        }

//        /// <summary>
//        /// 开始一个Extjs表单的控件组       
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <returns>ExtFormItems类</returns>
//        public static ExtFormItems BeginItems<TViewModel>(this ExtjsHtmlHelper<TViewModel> html)
//        {
//            //和Extjs表单一样，只拼接前面的部分，最后的结束标记]会在using{}结束后加上
//            string script = "items: [";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            ExtFormItems rv = new ExtFormItems(html.InnerHelper.ViewContext);
//            return rv;
//        }

//        /// <summary>
//        /// 开始一个表单内嵌容器
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper</param>
//        /// <param name="title">标题，当容器在Tab中显示时使用</param>
//        /// <param name="layout">容器布局</param>
//        /// <param name="halign">水平布局参数，只在layout=hbox时有效</param>
//        /// <param name="valign">垂直布局参数，只在layout=vbox时有效</param>
//        /// <returns>ExtFieldContainer类</returns>
//        public static ExtFieldContainer BeginFieldContainer<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string title = "", ExtLayoutEnum layout = ExtLayoutEnum.auto, ExtHBoxAlignEnum halign = ExtHBoxAlignEnum.top, ExtVBoxAlignEnum valign = ExtVBoxAlignEnum.left, int? flex = null, int? innerFlex = 1, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null)
//        {
//            //根据布局拼接layout
//            string layoutstring = "";
//            switch (layout)
//            {
//                case ExtLayoutEnum.auto:
//                    layoutstring = "layout: 'auto',";
//                    break;
//                case ExtLayoutEnum.form:
//                    layoutstring = "layout: 'form',";
//                    break;
//                case ExtLayoutEnum.hbox:
//                    layoutstring = "layout : { type : 'hbox', align : '" + Enum.GetName(typeof(ExtHBoxAlignEnum), halign) + "'},";
//                    break;
//                case ExtLayoutEnum.vbox:
//                    layoutstring = "layout : { type : 'vbox', align : '" + Enum.GetName(typeof(ExtVBoxAlignEnum), valign) + "'},";
//                    break;
//                default:
//                    break;
//            }
//            //和Extjs表单一样，只拼接前面的部分，最后的结束标记]会在using{}结束后加上
//            string script = @"{
//                title: '" + title + @"',
//                xtype: 'fieldcontainer',
//                ";
//            if (innerFlex != null)
//            {
//                script += "fieldDefaults: {flex:" + innerFlex.Value + "},";
//            }
//            if (width.HasValue)
//            {
//                script += "width: " + width.Value + "," + Environment.NewLine;
//            }
//            if (height.HasValue)
//            {
//                script += "height: " + height.Value + "," + Environment.NewLine;
//            }
//            if (maxWidth.HasValue)
//            {
//                script += "maxWidth: " + maxWidth.Value + "," + Environment.NewLine;
//            }
//            if (maxHeight.HasValue)
//            {
//                script += "maxHeight: " + maxHeight.Value + "," + Environment.NewLine;
//            }
//            if (flex.HasValue)
//            {
//                script += "flex: " + flex.Value + "," + Environment.NewLine;
//            }
//            else
//            {
//                script += "flex: null,";
//            }
//            script += layoutstring;
//            script += @"
//                items: [
//                ";
//            //输出脚本
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            //返回ExtFieldContainer类
//            ExtFieldContainer rv = new ExtFieldContainer(html.InnerHelper.ViewContext);
//            return rv;
//        }

//        public static ExtFieldContainer BeginFieldSet<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, ExtLayoutEnum layout = ExtLayoutEnum.auto, ExtPackEnum pack = ExtPackEnum.start, ExtHBoxAlignEnum halign = ExtHBoxAlignEnum.top, ExtVBoxAlignEnum valign = ExtVBoxAlignEnum.left, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, int? flex = null, bool showHeader = true)
//        {
//            //根据布局拼接layout
//            string layoutstring = "";
//            switch (layout)
//            {
//                case ExtLayoutEnum.auto:
//                    layoutstring = "layout: 'auto',";
//                    break;
//                case ExtLayoutEnum.form:
//                    layoutstring = "layout: 'form',";
//                    break;
//                case ExtLayoutEnum.hbox:
//                    layoutstring = "layout : { type : 'hbox', align : '" + Enum.GetName(typeof(ExtHBoxAlignEnum), halign) + "', pack :'" + Enum.GetName(typeof(ExtPackEnum), pack) + "'},";
//                    break;
//                case ExtLayoutEnum.vbox:
//                    layoutstring = "layout : { type : 'vbox', align : '" + Enum.GetName(typeof(ExtVBoxAlignEnum), valign) + "', pack :'" + Enum.GetName(typeof(ExtPackEnum), pack) + "'},";
//                    break;
//                default:
//                    break;
//            }

//            string script = @"{
//                xtype: 'fieldset',
//                autoScroll: true,
//                collapsible: true,
//                titleCollapse: true,
//                ";

//            script += layoutstring;
//            script += "header: " + showHeader.ToString().ToLower() + "," + Environment.NewLine;
//            script += "border: " + showHeader.ToString().ToLower() + "," + Environment.NewLine;
//            if (width.HasValue)
//            {
//                script += "width: " + width.Value + "," + Environment.NewLine;
//            }
//            if (height.HasValue)
//            {
//                script += "height: " + height.Value + "," + Environment.NewLine;
//            }
//            if (maxWidth.HasValue)
//            {
//                script += "maxWidth: " + maxWidth.Value + "," + Environment.NewLine;
//            }
//            if (maxHeight.HasValue)
//            {
//                script += "maxHeight: " + maxHeight.Value + "," + Environment.NewLine;
//            }
//            if (flex.HasValue)
//            {
//                script += "flex: " + flex.Value + "," + Environment.NewLine;
//            }
//            script += "hidden: " + (!visible).ToString().ToLower() + "," + Environment.NewLine;
//            script += "collapsed: " + (!expanded).ToString().ToLower() + "," + Environment.NewLine;
//            if (title != null)
//            {
//                script += "title: '" + title.Replace("'", "\\\'") + "'," + Environment.NewLine;
//            }
//            script += @"
//                items: [
//                ";

//            //输出Div和Script，form将会被渲染在div中。 script并没有结束标记，是因为form后面还会拼接各种控件，直到最后using{}结束的时候才会拼上最后的</script>
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            //返回ExtForm
//            ExtFieldContainer rv = new ExtFieldContainer(html.InnerHelper.ViewContext);
//            return rv;

//        }


//        /// <summary>
//        /// 开始一个Extjs表单的按钮组
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <returns>ExtFormButtons类</returns>
//        public static ExtFormButtons BeginFormButtons<TViewModel>(this ExtjsHtmlHelper<TViewModel> html)
//        {
//            //和Extjs表单一样，只拼接前面的部分，最后的结束标记]会在using{}结束后加上
//            string script = "buttons: [";
//            //输出脚本
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            //返回ExtFormButtons类
//            ExtFormButtons rv = new ExtFormButtons(html.InnerHelper.ViewContext);
//            return rv;
//        }

//        /// <summary>
//        /// 创建一个提交按钮
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="url">提交表单的地址，如果为空则表示使用表单的地址</param>
//        /// <param name="targetDivID">提交后需要刷新的DivID，如果为空表示使用当前VM默认的div</param>
//        public static void SubmitButton<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string url = null, string targetDivID = null, string buttonText = null, string beforeSubmit = null)
//        {
//            //新建一个ExtjsButton
//            ExtjsButton button = new ExtjsButton();
//            //如果未指定按钮文字，则使用默认的‘提交’，否则使用指定的文字
//            if (string.IsNullOrWhiteSpace(buttonText))
//            {
//                button.ButtonText = Resources.Language.提交;
//            }
//            else
//            {
//                button.ButtonText = buttonText;
//            }
//            button.Url = url;
//            //如果没有指定刷新的div，则使用当前VM的ViewDivID
//            if (string.IsNullOrWhiteSpace(targetDivID))
//            {
//                var model = html.InnerHelper.ViewData.Model as BaseVM;
//                if (model != null)
//                {
//                    targetDivID = model.ViewDivID;
//                }
//            }
//            button.TargetDivID = targetDivID;
//            button.OnClick = beforeSubmit;
//            //使用ExtjsSubmitButton的模版来生成按钮
//            var rv = html.InnerHelper.Editor("", "ExtjsSubmitButton", new { obj = button });
//            html.InnerHelper.ViewContext.Writer.WriteLine(rv.ToHtmlString());
//        }

//        public static void CloseButton<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string buttonText = null)
//        {
//            if (buttonText == null)
//            {
//                buttonText = Resources.Language.关闭;
//            }
//            html.Button(null, html.Scripts.CloseDialog(), buttonText);
//        }

//        public static void DownloadTemplateButton<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IBaseImport<BaseTemplateVM>>> fieldExp = null, string buttonText = null, string formID = null, string clickScript = null)
//        {
//            if (buttonText == null)
//            {
//                buttonText = Resources.Language.下载模板;
//            }
//            Type t = null;
//            if (fieldExp == null)
//            {
//                t = typeof(TViewModel);
//            }
//            else
//            {
//                t = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model).GetType();
//            }
//            //string click = "FF_DownloadTemplatePost('/Home/ExportExcelTemplate','" + t.FullName + "')";
//            StringBuilder sb = new StringBuilder();
//            if (clickScript != null)
//            {
//                sb.Append(clickScript);
//                if (!clickScript.EndsWith(";"))
//                {
//                    sb.Append(";");
//                }
//            }
//            sb.AppendFormat("FF_DownloadTemplatePost('/Home/ExportExcelTemplate','{0}','{1}')", t.FullName, formID);
//            html.Button(null, sb.ToString(), buttonText);
//        }

//        public static void Button<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string url = null, string onClick = null, string buttonText = null, string href = null)
//        {
//            //新建一个ExtjsButton
//            ExtjsButton button = new ExtjsButton();
//            //如果未指定按钮文字，则使用默认的‘提交’，否则使用指定的文字
//            if (string.IsNullOrWhiteSpace(buttonText))
//            {
//                button.ButtonText = Resources.Language.提交;
//            }
//            else
//            {
//                button.ButtonText = buttonText;
//            }
//            button.Href = href;
//            button.OnClick = onClick;
//            //如果当前用户没有权限访问指定URL，则根据配置对连接进行隐藏或禁用操作
//            var vm = html.InnerHelper.ViewData.Model as BaseVM;
//            if (!string.IsNullOrEmpty(url) && (vm.LoginUserInfo == null || vm.LoginUserInfo.IsAccessable(url) == false))
//            {
//                //读取WebConfig中的配置
//                string NoRight = System.Configuration.ConfigurationManager.AppSettings["NoRight"];
//                //如果配置为invisible，则隐藏链接
//                if (NoRight.ToLower() == "invisible")
//                {
//                    button.Hidden = true;
//                }
//                //如果配置为其他，则禁用链接
//                else
//                {
//                    button.Disabled = true;
//                }
//            }

//            //使用ExtjsButton的模版来生成按钮
//            var rv = html.InnerHelper.Editor("", "ExtjsButton", new { obj = button });
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        /// <summary>
//        /// 对某个字段生成标签和文本框的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="width">文本框宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="readOnly">是否只读</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndTextFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, object>> fieldExp, int? width = null, int? height = null, int? flex = null, bool readOnly = false, string labelText = null, string inputtype = "text")
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            //获取文本字段的长度限制信息
//            var stringLength = pi.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute;
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.IsRequired = isRequired;
//            obj.Error = expError;
//            obj.IsReadOnly = readOnly;
//            obj.Width = width;
//            obj.Height = height;
//            obj.Flex = flex;
//            obj.InputType = inputtype;
//            if (stringLength != null)
//            {
//                obj.MaxLength = stringLength.MaximumLength;
//                obj.MinLength = stringLength.MinimumLength;
//            }
//            //使用ExtjsTextField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsTextField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        #region add dy dufei
//        public static void LabelAndTextForWithEvents<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, object>> fieldExp, int? width = null, int? height = null, int? flex = null, bool readOnly = false, string labelText = null, string inputtype = "text")
//        {
//            html.LabelAndTextFor(fieldExp, width, height, 1, false, labelText, inputtype);
//            var script2 = @"
//            {
//                listeners:{
//                    change: function(self,newval) {
//                        var f = self.up('fieldcontainer').down('field');
//                        f.setDisabled(!newval);
//                        if(newval == true){
//                            f.focus(false,true);
//                        }
//                    },
//                    
//              }
//            }
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script2);

//        }
//        #endregion

//        public static void LabelAndTextWithCheckBoxFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, object>> fieldExp, int? width = null, int? height = null, bool enabled = true, string labelText = null, string inputtype = "text")
//        {
//            var script = @"
//                {xtype: 'fieldcontainer',
//                 layout : { type : 'hbox', align : 'stretch'},
//                 items:[
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            html.LabelAndTextFor(fieldExp, width, height, 1, false, labelText, inputtype);
//            var script2 = @"
//            {
//                hideLabel:true,
//                listeners:{
//                    change: function(self,newval) {
//                        var f = self.up('fieldcontainer').down('field');
//                        f.setDisabled(!newval);
//                        if(newval == true){
//                            f.focus(false,true);
//                        }
//                    },
//                    boxready: function(self){
//                        self.setValue(" + enabled.ToString().ToLower() + @");
//                        self.up('fieldcontainer').down('field').setDisabled(" + (!enabled).ToString().ToLower() + @");
//                     }
//                },
//                flex:null,
//                margin: '0 0 0 5',
//                xtype: 'checkboxfield'
//        }]},
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script2);

//        }

//        public static void LabelAndMLTextFor<TViewModel, TContent>(
//            this ExtjsHtmlHelper<TViewModel> html,
//            Expression<Func<TViewModel, IMLData<TContent>>> mlExp,
//            Expression<Func<TContent, string>> memberExp,
//            int? width = null,
//            int? height = null,
//            int? flex = null,
//            string labelText = null)
//            where TContent : MLContent
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(memberExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            var mlrequired = pi.GetCustomAttributes(typeof(MLRequiredAttribute), false).FirstOrDefault() as MLRequiredAttribute;
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, Utils.GetPropertyName(mlExp) + ".MLContents" + Utils.GetPropertyName(memberExp));
//            //获取文本字段的长度限制信息
//            var stringLength = pi.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute;

//            var mlcontents = mlExp.Compile().Invoke(html.InnerHelper.ViewData.Model).GetMLContents();

//            //重组系统所支持的语言，将当前语言排在最前
//            List<SupportedLanguage> lans = new List<SupportedLanguage>();
//            var CurrentLanguage = Utils.GetCurrentLanguage();
//            lans.Add(CurrentLanguage);
//            lans.AddRange(BaseController.Languages.Where(x => x.LanguageCode.ToLower() != CurrentLanguage.LanguageCode.ToLower()));
//            List<MLInfo> infos = new List<MLInfo>();
//            foreach (var lan in lans)
//            {
//                MLInfo info = new MLInfo();
//                info.LanguageCode = lan.LanguageCode;
//                info.LanguageName = lan.LanguageName;
//                info.Value = "";
//                var content = mlcontents.Where(x => x.LanguageCode == lan.LanguageCode).FirstOrDefault();
//                if (content != null)
//                {
//                    var val = content.GetType().GetProperty(pi.Name).GetValue(content, null);
//                    info.Value = val == null ? null : val.ToString();
//                    if (info.Value != null)
//                    {
//                        info.Value = info.Value.Replace("'", "\\\'").Replace(Environment.NewLine, "\\n").Replace("\n", "\\n");
//                    }
//                    info.ID = content.ID;
//                    info.ParentID = content.MLParentID;
//                }
//                infos.Add(info);
//            }


//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsMLTextField obj = new ExtjsMLTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(mlExp) + ".MLContents" + Utils.GetPropertyName(memberExp);
//            obj.Value = mlExp.Compile().Invoke(html.InnerHelper.ViewData.Model).GetMLContentValue(memberExp);
//            if (obj.Value != null)
//            {
//                obj.Value = obj.Value.Replace("'", "\\\'").Replace(Environment.NewLine, "\\n").Replace("\n", "\\n");
//            }
//            obj.IsRequired = isRequired;
//            if (mlrequired != null)
//            {
//                obj.RequiredAll = mlrequired.AllLanguageRequired;
//            }
//            obj.Error = expError;
//            obj.IsReadOnly = true;
//            obj.Width = width;
//            obj.Height = height;
//            obj.Flex = flex;
//            obj.Title = Utils.GetPropertyDisplayName(pi) + Resources.Language.多语言数据;
//            if (stringLength != null)
//            {
//                obj.MaxLength = stringLength.MaximumLength;
//                obj.MinLength = stringLength.MinimumLength;
//            }
//            obj.FieldName = Utils.GetPropertyName(memberExp);
//            obj.LongName = Utils.GetPropertyName(mlExp) + ".MLContents";
//            obj.MLInfos = infos;
//            //使用ExtjsTextField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsMLTextField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        /// <summary>
//        /// 创建一个隐藏表单项
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        public static void HiddenFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, object>> fieldExp)
//        {
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsBaseInputElement obj = new ExtjsBaseInputElement();
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            //使用ExtjsTextField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsHiddenField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        public static void ListValuesFor<TViewModel, V>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IEnumerable<V>>> fieldExp)
//        {
//            string fieldname = Utils.GetPropertyName(fieldExp);
//            var fields = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            for (int i = 0; i < fields.Count(); i++)
//            {
//                //创建一个ExtjsTextField类，并将上面获取的值赋给他
//                ExtjsBaseInputElement obj = new ExtjsBaseInputElement();
//                obj.Name = fieldname;
//                obj.Value = fields.ElementAt(i).ToString();
//                obj.Id = Utils.GetIDByName(fieldname + "[" + i + "]");
//                //使用ExtjsTextField的模版来生成控件
//                var rv = html.InnerHelper.Editor("", "ExtjsHiddenField", new { obj = obj });
//                //输出html
//                html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//            }
//        }


//        /// <summary>
//        /// 对某个字段生成标签和值的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <typeparam name="TValue">字段类</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="width">文本框宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndDisplayFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, int? width = null, int? height = null, int? flex = null, string labelText = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取表达式的值，并过滤单引号
//            string val = "";
//            try
//            {
//                val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            }
//            catch { }
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.Width = width;
//            obj.Flex = flex;
//            obj.Height = height;
//            //使用ExtjsDisplayField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsDisplayField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        public static void LabelAndDisplayFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, BoolComboTypes boolType, string trueText = null, string falseText = null, int? width = null, int? height = null, int? flex = null, string labelText = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            string yesText = "";
//            string noText = "";
//            //根据布尔类型设定显示文字
//            switch (boolType)
//            {
//                case BoolComboTypes.是否:
//                    yesText = Resources.Language.是;
//                    noText = Resources.Language.否;
//                    break;
//                case BoolComboTypes.有效无效:
//                    yesText = Resources.Language.有效;
//                    noText = Resources.Language.无效;
//                    break;
//                case BoolComboTypes.男女:
//                    yesText = Resources.Language.男;
//                    noText = Resources.Language.女;
//                    break;
//                case BoolComboTypes.有无:
//                    yesText = Resources.Language.有;
//                    noText = Resources.Language.无;
//                    break;
//                case BoolComboTypes.自定义:
//                    yesText = trueText == null ? "" : trueText;
//                    noText = falseText == null ? "" : falseText;
//                    break;
//                default:
//                    break;
//            }
//            //根据最终布尔值的真假确定最终显示的内容
//            if (val.ToLower() == "true")
//            {
//                obj.Value = yesText;
//            }
//            if (val.ToLower() == "false")
//            {
//                obj.Value = noText;
//            }

//            obj.Width = width;
//            obj.Flex = flex;
//            obj.Height = height;
//            //使用ExtjsDisplayField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsDisplayField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }


//        /// <summary>
//        /// 对某个字段生成标签和值的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <typeparam name="TContent">多语言内容</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="mlExp">获取多语言内容的表达式</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="width">文本框宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndMLDisplayFor<TViewModel, TContent>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IMLData<TContent>>> mlExp, Expression<Func<TContent, string>> fieldExp, int? width = null, int? height = null, int? flex = null, string labelText = null)
//            where TContent : MLContent
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取表达式的值，并过滤单引号
//            string val = "";
//            try
//            {
//                //获取多语言子表
//                var textValues = mlExp.Compile()(html.InnerHelper.ViewData.Model);
//                //获取当前语言下的内容
//                val = textValues.GetMLContentValue(fieldExp).Replace("'", "\\\'").Replace(Environment.NewLine, "\\n").Replace("\n", "\\n");
//            }
//            catch { }
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.Width = width;
//            obj.Flex = flex;
//            obj.Height = height;
//            //使用ExtjsDisplayField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsDisplayField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        public static void HtmlEditorFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, object>> fieldExp, int? width = null, int? height = null, int? flex = null, bool readOnly = false, string labelText = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            //获取文本字段的长度限制信息
//            var stringLength = pi.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute;
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.IsRequired = isRequired;
//            obj.Error = expError;
//            obj.IsReadOnly = readOnly;
//            obj.Width = width;
//            obj.Height = height;
//            obj.Flex = flex;
//            if (stringLength != null)
//            {
//                obj.MaxLength = stringLength.MaximumLength;
//                obj.MinLength = stringLength.MinimumLength;
//            }
//            //使用ExtjsTextField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsHtmlEditor", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }


//        public static void Text<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string text, int? width = null, int? height = null, int? flex = null)
//        {
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = "";
//            obj.Name = Guid.NewGuid().ToString();
//            obj.Value = text.Replace("'", "\\\'").Replace(Environment.NewLine, "\\n").Replace("\n", "\\n");
//            obj.Width = width;
//            obj.Flex = flex;
//            obj.Height = height;
//            //使用ExtjsDisplayField的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsDisplayField", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }


//        /// <summary>
//        /// 对于枚举生成标签和下拉菜单的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <typeparam name="TValue">字段类</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定的枚举类型的字段的表达式</param>
//        /// <param name="firstRow">首行显示的内容</param>
//        /// <param name="width">控件宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="readOnly">是否只读</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndComboBoxFromEnum<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, bool isMultiple = false, ComboFirstRow firstRow = ComboFirstRow.无, string emptyText = null, int? width = null, int? flex = null, bool readOnly = false, string labelText = null, bool editable = true)
//        {
//            //用反射读取枚举类型中的所有枚举，并生成下拉菜单
//            Type t = typeof(TValue);
//            List<SelectListItem> items = new List<SelectListItem>();
//            items.AddRange(t.ToListItems(firstRow));
//            //生成下拉菜单
//            html.LabelAndComboBoxFor(fieldExp, items, isMultiple, emptyText, width, flex, readOnly, labelText, editable);
//        }

//        public static void LabelAndComboBoxWithCheckBoxFromEnum<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, bool isMultiple = false, ComboFirstRow firstRow = ComboFirstRow.无, string emptyText = null, bool enabled = true, string labelText = null)
//        {
//            var script = @"
//                {xtype: 'fieldcontainer',
//                 layout : { type : 'hbox', align : 'stretch'},
//                 items:[
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            html.LabelAndComboBoxFromEnum(fieldExp, isMultiple, firstRow, emptyText, null, 1, false, labelText, true);
//            var script2 = @"
//            {
//                hideLabel:true,
//                listeners:{
//                    change: function(self,newval) {
//                        var f = self.up('fieldcontainer').down('field');
//                        f.setDisabled(!newval);
//                        if(newval == true){
//                            f.focus(false,true);
//                        }
//                    },
//                    boxready: function(self){
//                        self.setValue(" + enabled.ToString().ToLower() + @");
//                        self.up('fieldcontainer').down('field').setDisabled(" + (!enabled).ToString().ToLower() + @");
//                     }
//                },
//                flex:null,
//                margin: '0 0 0 5',
//                xtype: 'checkboxfield'
//        }]},
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script2);
//        }

//        /// <summary>
//        /// 对于下拉菜单数据列表的字段生成标签和下拉菜单的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <typeparam name="TValue">字段类</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="items">指向下拉菜单数据源的表达式</param>
//        /// <param name="firstRow">首行显示的内容</param>
//        /// <param name="width">控件宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="readOnly">是否只读</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndComboBoxFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, Expression<Func<TViewModel, IEnumerable<SelectListItem>>> items, bool isMultiple = false, string emptyText = null, int? width = null, int? flex = null, bool readOnly = false, string labelText = null, bool editable = true, Expression<Func<TViewModel, object>> linkedField = null, string linkedUrl = null)
//        {
//            //获取表达式的值
//            var itemsList = items.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            //生成下拉菜单
//            html.LabelAndComboBoxFor(fieldExp, itemsList, isMultiple, emptyText, width, flex, readOnly, labelText, editable, linkedField, linkedUrl);
//        }

//        public static void LabelAndComboBoxWithCheckBoxFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, Expression<Func<TViewModel, IEnumerable<SelectListItem>>> items, bool isMultiple = false, string emptyText = null, bool enabled = true, string labelText = null)
//        {
//            var script = @"
//                {xtype: 'fieldcontainer',
//                 layout : { type : 'hbox', align : 'stretch'},
//                 items:[
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            html.LabelAndComboBoxFor(fieldExp, items, isMultiple, emptyText, null, 1, false, labelText, true);
//            var script2 = @"
//            {
//                hideLabel:true,
//                listeners:{
//                    change: function(self,newval) {
//                        var f = self.up('fieldcontainer').down('field');
//                        f.setDisabled(!newval);
//                        if(newval == true){
//                            f.focus(false,true);
//                        }
//                    },
//                    boxready: function(self){
//                        self.setValue(" + enabled.ToString().ToLower() + @");
//                        self.up('fieldcontainer').down('field').setDisabled(" + (!enabled).ToString().ToLower() + @");
//                     }
//                },
//                flex:null,
//                margin: '0 0 0 5',
//                xtype: 'checkboxfield'
//        }]},
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script2);
//        }

//        /// <summary>
//        /// 对于下拉菜单数据列表的字段生成标签和下拉菜单的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <typeparam name="TValue">字段类</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="items">下拉列表中的数据</param>
//        /// <param name="firstRow">首行显示的内容</param>
//        /// <param name="width">控件宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="readOnly">是否只读</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndComboBoxFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, IEnumerable<SelectListItem> items, bool isMultiple = false, string emptyText = null, int? width = null, int? flex = null, bool readOnly = false, string labelText = null, bool editable = true, Expression<Func<TViewModel, object>> linkedField = null, string linkedUrl = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            //获取表达式的值，并过滤单引号
//            string val = "";
//            if (typeof(TValue).IsGenericType && typeof(TValue).GetGenericTypeDefinition() == typeof(List<>))
//            {
//                var list = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model) as IList;

//                val = "[" + list.ToSpratedString(Format: (v) => { return "'" + (v == null ? "" : v.ToString().Replace("'", "\\\'")) + "'"; }) + "]";
//            }
//            else
//            {
//                val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            }
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            //创建一个ExtjsComboBox类，并将上面获取的值赋给他
//            ExtjsComboBox obj = new ExtjsComboBox();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.IsRequired = isRequired;
//            obj.Error = expError;
//            obj.IsReadOnly = readOnly;
//            obj.Width = width;
//            obj.Items = items.ToList();
//            obj.Flex = flex;
//            obj.Editable = editable;
//            obj.IsMultiple = isMultiple;
//            if (emptyText == null)
//            {
//                emptyText = "";
//            }
//            obj.EmptyText = emptyText;
//            if (linkedField != null && linkedUrl != null)
//            {
//                obj.LinkedID = Utils.GetPropertyName(linkedField);
//                obj.LinkedUrl = linkedUrl;
//            }
//            //使用ExtjsComboBox的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsComboBox", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        public static void LabelAndComboBoxWithCheckBoxFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, IEnumerable<SelectListItem> items, bool isMultiple = false, string emptyText = null, bool enabled = true, string labelText = null)
//        {
//            var script = @"
//                {xtype: 'fieldcontainer',
//                 layout : { type : 'hbox', align : 'stretch'},
//                 items:[
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            html.LabelAndComboBoxFor(fieldExp, items, isMultiple, emptyText, null, 1, false, labelText, true);
//            var script2 = @"
//            {
//                hideLabel:true,
//                listeners:{
//                    change: function(self,newval) {
//                        var f = self.up('fieldcontainer').down('field');
//                        f.setDisabled(!newval);
//                        if(newval == true){
//                            f.focus(false,true);
//                        }
//                    },
//                    boxready: function(self){
//                        self.setValue(" + enabled.ToString().ToLower() + @");
//                        self.up('fieldcontainer').down('field').setDisabled(" + (!enabled).ToString().ToLower() + @");
//                     }
//                },
//                flex:null,
//                margin: '0 0 0 5',
//                xtype: 'checkboxfield'
//        }]},
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script2);
//        }
//        /// <summary>
//        /// 对于布尔值生成标签和CheckBox的组合控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定的布尔值字段的表达式</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="readOnly">是否只读</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        /// <param name="labelAfterText">显示在CheckBox后面的文本，默认为空</param>
//        public static void LabelAndCheckBoxFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, bool>> fieldExp, int? flex = null, bool readOnly = false, string labelText = null, string labelAfterText = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            //创建一个ExtjsComboBox类，并将上面获取的值赋给他
//            ExtjsCheckBox obj = new ExtjsCheckBox();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.IsRequired = isRequired;
//            obj.Error = expError;
//            obj.IsReadOnly = readOnly;
//            obj.LabelAfter = Utils.GetResourceText(labelAfterText);
//            obj.Flex = flex;
//            //使用ExtjsCheckBox的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsCheckBox", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }



//        /// <summary>
//        /// 对于日期声称标签和日期控件
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <typeparam name="TValue">字段类</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="datetype">日期的样式</param>
//        /// <param name="width">控件宽度</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="readOnly">是否只读</param>
//        /// <param name="labelText">标签文本，可以指定此内容来替换字段原本的名称属性</param>
//        public static void LabelAndDateFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, DateTimeTypeEnum datetype = DateTimeTypeEnum.Date, int? width = null, int? flex = null, bool readOnly = false, string labelText = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            //获取日期的范围限制信息
//            var dateRange = pi.GetCustomAttributes(typeof(RangeAttribute), false).FirstOrDefault() as RangeAttribute;
//            //创建一个ExtjsDate类，并将上面获取的值赋给他
//            ExtjsDate obj = new ExtjsDate();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.IsRequired = isRequired;
//            obj.Error = expError;
//            obj.IsReadOnly = readOnly;
//            obj.Width = width;
//            obj.Flex = flex;
//            obj.datetype = Enum.GetName(typeof(DateTimeTypeEnum), datetype);
//            //如果设定了范围信息，则给MaxValue和MinValue赋值
//            if (dateRange != null)
//            {
//                DateTime temp;
//                if (DateTime.TryParse(dateRange.Maximum.ToString(), out temp) == true)
//                {
//                    obj.MaxValue = temp;
//                }
//                if (DateTime.TryParse(dateRange.Minimum.ToString(), out temp) == true)
//                {
//                    obj.MinValue = temp;
//                }
//            }
//            //获取变量名称，找到成对出现的StartXXX和EndXXX，如果有这种成对出现的变量名，则默认加上StartXXX必须小于等于EndXXX的自定义验证
//            var fname = Utils.GetPropertyName(fieldExp, false);
//            //如果变量名以Start开头
//            if (fname.StartsWith("Start"))
//            {
//                //寻找在这个变量的类中，是否存在另一个叫EndXXX的DateTime变量
//                var endpi = pi.DeclaringType.GetProperty(fname.Replace("Start", "End"));
//                //如果存在，将EndField赋值，并设定vType
//                if (endpi != null && (endpi.PropertyType == typeof(DateTime) || endpi.PropertyType == typeof(DateTime?)))
//                {
//                    obj.EndField = obj.Name.Replace(fname, endpi.Name);
//                    if (datetype == DateTimeTypeEnum.Time)
//                    {
//                        obj.vType = "timerange";
//                    }
//                    else
//                    {
//                        obj.vType = "daterange";
//                    }
//                }
//            }
//            //如果变量名以End开头
//            if (fname.StartsWith("End"))
//            {
//                //寻找这个变量的类中，是否存在另一个叫EndXXX的DateTime变量
//                var startpi = pi.DeclaringType.GetProperty(fname.Replace("End", "Start"));
//                //如果存在，将StartField赋值，并设定vType
//                if (startpi != null && (startpi.PropertyType == typeof(DateTime) || startpi.PropertyType == typeof(DateTime?)))
//                {
//                    obj.StartField = obj.Name.Replace(fname, startpi.Name);
//                    if (datetype == DateTimeTypeEnum.Time)
//                    {
//                        obj.vType = "timerange";
//                    }
//                    else
//                    {
//                        obj.vType = "daterange";
//                    }
//                }
//            }

//            //使用ExtjsDate的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsDate", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        public static void LabelAndDateWithCheckBoxFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, DateTimeTypeEnum datetype = DateTimeTypeEnum.Date, bool enabled = false, string labelText = null)
//        {
//            var script = @"
//                {xtype: 'fieldcontainer',
//                 layout : { type : 'hbox', align : 'stretch'},
//                 items:[
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            html.LabelAndDateFor(fieldExp, datetype, null, 1, false, labelText);
//            var script2 = @"
//            {
//                hideLabel:true,
//                listeners:{
//                    change: function(self,newval) {
//                        var f = self.up('fieldcontainer').down('field');
//                        f.setDisabled(!newval);
//                        if(newval == true){
//                            f.focus(false,true);
//                        }
//                    },
//                    boxready: function(self){
//                        self.setValue(" + enabled.ToString().ToLower() + @");
//                        self.up('fieldcontainer').down('field').setDisabled(" + (!enabled).ToString().ToLower() + @");
//                     }
//                },
//                flex:null,
//                margin: '0 0 0 5',
//                xtype: 'checkboxfield'
//        }]},
//";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script2);
//        }
//        // liusp 2013-12-28 修改 添加 isbasedb参数
//        public static void LabelAndUploadFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, object>> fieldExp, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, int? flex = null, bool enabled = false, string labelText = null, UploadTypesEnum uType = UploadTypesEnum.所有文件, string fileType = null, string fileTypeDes = null, int MaxSize = 4096, bool forceRequired = false, bool isbasedb = false, bool UploadFileInDB = false)
//        {
//            ExtjsUpload obj = new ExtjsUpload();
//            obj.SaveText = Utils.GetResourceText("保存中");
//            obj.StopText = Utils.GetResourceText("中断");
//            obj.CompleteText = Utils.GetResourceText("上传完毕");
//            obj.FileErrorText = Utils.GetResourceText("只能选择一个文件");
//            obj.UploadText = Utils.GetResourceText("上传中");
//            obj.ReadyText = Utils.GetResourceText("请上传");
//            obj.Width = width;
//            obj.Height = height;
//            obj.Flex = flex;
//            obj.MaxWidth = maxWidth;
//            obj.MaxHeight = maxHeight;
//            obj.IsBaseDB = isbasedb;
//            obj.UploadFileInDB = UploadFileInDB;
//            switch (uType)
//            {
//                case UploadTypesEnum.所有文件:
//                    obj.FileType = "*.*";
//                    obj.FileTypeDes = Resources.Language.所有文件;
//                    break;
//                case UploadTypesEnum.图片文件:
//                    obj.FileType = "*.jpg;*.jpeg;*.gif;*.bmp;*.png;*.tif";
//                    obj.FileTypeDes = Resources.Language.图片文件;
//                    break;
//                case UploadTypesEnum.Zip文件:
//                    obj.FileType = "*.zip";
//                    obj.FileTypeDes = Resources.Language.Zip文件;
//                    break;
//                case UploadTypesEnum.Excel文件:
//                    obj.FileType = "*.xls;*.xlsx";
//                    obj.FileTypeDes = Resources.Language.Excel文件;
//                    break;
//                case UploadTypesEnum.PDF文件:
//                    obj.FileType = "*.pdf";
//                    obj.FileTypeDes = Resources.Language.PDF文件;
//                    break;
//                case UploadTypesEnum.Word文件:
//                    obj.FileType = "*.doc;*.docx";
//                    obj.FileTypeDes = Resources.Language.Word文件;
//                    break;
//                case UploadTypesEnum.文本文件:
//                    obj.FileType = "*.txt";
//                    obj.FileTypeDes = Resources.Language.文本文件;
//                    break;
//                case UploadTypesEnum.自定义:
//                    obj.FileType = fileType;
//                    obj.FileTypeDes = fileTypeDes;
//                    break;
//                default:
//                    break;
//            }
//            if (fieldExp != null)
//            {
//                //获取字段属性信息
//                PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//                //获取标签
//                string label = Utils.GetPropertyDisplayName(pi, labelText);
//                //获取字段是否为必填
//                bool isRequired = Utils.IsPropertyRequired(pi);
//                //获取表达式的值，并过滤单引号
//                string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//                //获取表达式相关的错误信息
//                string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//                obj.Value = val;
//                obj.Error = expError;
//                obj.IsRequired = isRequired;
//                obj.Name = Utils.GetPropertyName(fieldExp);
//                obj.Id = Utils.GetIDByName(obj.Name);
//                obj.Label = label;
//                long tryid = 0;
//                long.TryParse(val, out tryid);
//                //如果绑定字段的值大于零，说明已经上传过文件。则访问数据库读取已上传文件的文件名显示在控件上
//                if (tryid > 0)
//                {
//                    using (var dc = new DataAccess.DataContext())
//                    {
//                        var fn = dc.FileAttachments.Where(x => x.ID == tryid).Select(x => x.FileName).SingleOrDefault();
//                        obj.FileName = fn;
//                    }
//                }
//            }
//            else
//            {
//                obj.Name = "UploadFileID";
//                obj.Id = "UploadFileID";
//                obj.IsRequired = forceRequired;
//                obj.Label = labelText;
//                var temp = typeof(TViewModel).GetProperty("UploadFileID").GetValue(html.InnerHelper.ViewData.Model);
//                if (temp != null)
//                {
//                    obj.Value = temp.ToString();
//                    long tryid = 0;
//                    long.TryParse(obj.Value, out tryid);
//                    using (var dc = new DataAccess.DataContext())
//                    {
//                        var fn = dc.FileAttachments.Where(x => x.ID == tryid).Select(x => x.FileName).SingleOrDefault();
//                        obj.FileName = fn;
//                    }
//                }
//            }

//            //使用ExtjsDate的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsUpload", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        public static void LabelAndViewAttachmentFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, string labelText = null, int width = 500, int height = 500, int? flex = null, bool withView = true, bool withDownload = true)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取表达式的值，并过滤单引号
//            string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            //获取文本字段的长度限制信息
//            var stringLength = pi.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute;
//            //创建一个ExtjsTextField类，并将上面获取的值赋给他
//            ExtjsTextField obj = new ExtjsTextField();
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.Flex = flex;
//            string url = "/Home/ViewAttachment/" + val;
//            string downloadurl = "/Home/DownloadAttachment/" + val;
//            long tryvalue = 0;
//            long.TryParse(val, out tryvalue);
//            string script = @"
//{
//    xtype: 'fieldcontainer',
//    layout: { type: 'hbox', align: 'stretch' },
//";
//            if (flex != null)
//            {
//                script += "flex:" + flex.Value + ",";
//            }
//            else
//            {
//                script += "flex: null,";
//            }
//            script += @"
//    items:[
//        {
//            xtype:'hidden',
//            fieldLabel: '" + obj.Label + @"',
//            labelSeparator: '" + Utils.GetCurrentComma() + @"',
//            hideLabel:" + obj.HideLabel.ToString().ToLower() + @",
//            hidden: false
//        }";
//            if (withView == true && tryvalue > 0)
//            {
//                script += @",
//        {
//            xtype: 'button',
//            text: '" + Resources.Language.查看 + @"',
//            width: 70,
//            flex:1,
//            handler:function(){ 
//                " + html.Scripts.OpenDialog(url, Resources.Language.查看, width, height).ToHtmlString() + @"
//            }
//        }";
//            }
//            if (withDownload == true && tryvalue > 0)
//            {
//                script += @",
//        {
//            xtype: 'button',
//            text: '" + Resources.Language.下载 + @"',
//            width: 70,
//            flex:1,
//            handler:function(){ 
//                window.open('" + downloadurl + @"','hiddenpostif');
//            }
//        }";

//            }
//            if (tryvalue == 0)
//            {
//                script += @",
//        {
//            xtype:'displayfield',
//            value:'" + Resources.Language.无 + @"',
//            flex:1
//        }";
//            }
//            script += @"
//        ]
//},";
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//        }

//        public static void ImageFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, TValue>> fieldExp, int? width = null, int? height = null, int? flex = null, string url = null)
//        {
//            ExtjsImage obj = new ExtjsImage();
//            if (fieldExp != null)
//            {
//                //获取字段属性信息
//                PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//                string val = Utils.GetPropertyValue(fieldExp, html.InnerHelper.ViewData.Model);
//                obj.Url = "/Home/OutputAttachment/" + val;
//                obj.Width = width;
//                obj.Height = height;
//            }
//            else
//            {
//                obj.Url = url;
//                obj.Width = width;
//                obj.Height = height;
//            }
//            //使用ExtjsImage的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsImage", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }


//        public static void DoubleListBoxFor<TViewModel, TValue>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, List<TValue>>> fieldExp, Expression<Func<TViewModel, IEnumerable<SelectListItem>>> allItems, int? width = null, int? height = null, int? flex = null, bool readOnly = false, string labelText = null, string labelTextLeft = null, string labelTextRight = null)
//        {
//            //获取字段属性信息
//            PropertyInfo pi = Utils.GetPropertyInfo(fieldExp);
//            //获取标签
//            string label = Utils.GetPropertyDisplayName(pi, labelText);
//            //获取字段是否为必填
//            bool isRequired = Utils.IsPropertyRequired(pi);
//            //获取表达式的值，并过滤单引号
//            var list = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            string val = "[" + list.ToSpratedString(x => x, (v) => { return "'" + (v == null ? "" : v.ToString()) + "'"; }) + "]";
//            //获取表达式相关的错误信息
//            string expError = Utils.GetPropertyErrors(html.InnerHelper, fieldExp);
//            var ai = allItems.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            ExtjsDoubleList obj = new ExtjsDoubleList();
//            obj.AllItems = ai.ToList();
//            obj.Width = width;
//            obj.Height = height;
//            obj.LeftLabel = labelTextLeft;
//            obj.Label = label;
//            obj.Name = Utils.GetPropertyName(fieldExp);
//            obj.Value = val;
//            obj.IsRequired = isRequired;
//            obj.Error = expError;
//            obj.IsReadOnly = readOnly;
//            obj.Flex = flex;
//            obj.LeftLabel = Utils.GetResourceText(labelTextLeft);
//            obj.RightLabel = Utils.GetResourceText(labelTextRight);
//            //使用ExtjsComboBox的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsDoubleLink", new { obj = obj });
//            //输出html
//            html.InnerHelper.ViewContext.Writer.WriteLine(HttpUtility.HtmlDecode(rv.ToString()));
//        }

//        /// <summary>
//        /// 根据现有DIV生成ExtjsPanel
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="innerDivID">现有DIVID</param>
//        /// <param name="title">标题</param>
//        /// <param name="height">高度</param>
//        /// <param name="width">宽度</param>
//        /// <param name="expanded">是否展开</param>
//        /// <param name="visible">是否显示</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="isRoot">是否是最上层控件</param>
//        /// <param name="showHeader">是否显示头</param>
//        /// <returns>Html</returns>
//        public static MvcHtmlString Panel<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, string innerDivID = null, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, int? flex = null, bool isRoot = true, bool showHeader = true)
//        {
//            ExtjsPanel obj = new ExtjsPanel();
//            obj.Expanded = expanded;
//            obj.Flex = flex;
//            obj.Title = title;
//            obj.Visible = visible;
//            obj.Width = width;
//            obj.Height = height;
//            obj.ContentElement = innerDivID;
//            obj.IsRoot = isRoot;
//            obj.ShowHeader = showHeader;
//            obj.MaxWidth = maxWidth;
//            obj.MaxHeight = maxHeight;
//            obj.BaseViewDivID = (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID.ToString();
//            //使用ExtjsPanel的模版来生成控件
//            var rv = html.InnerHelper.Editor("", "ExtjsPanel", new { obj = obj });
//            if (isRoot == true)
//            {
//                return rv;
//            }
//            else
//            {
//                html.InnerHelper.ViewContext.Writer.WriteLine(rv);
//                return null;
//            }
//        }

//        /// <summary>
//        /// 开始一个ExtjsPanel
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="layout">布局方式</param>
//        /// <param name="pack">开始布局的位置</param>
//        /// <param name="halign">水平布局参数，只在layout=hbox时有效</param>
//        /// <param name="valign">垂直布局参数，只在layout=vbox时有效</param>
//        /// <param name="title">标题</param>
//        /// <param name="height">高度</param>
//        /// <param name="width">宽度</param>
//        /// <param name="expanded">是否展开</param>
//        /// <param name="visible">是否显示</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="isRoot">是否是最上层控件</param>
//        /// <param name="showHeader">是否显示头</param>
//        /// <returns>ExtPanel类</returns>
//        public static ExtPanel BeginPanel<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, ExtLayoutEnum layout = ExtLayoutEnum.auto, ExtPackEnum pack = ExtPackEnum.start, ExtHBoxAlignEnum halign = ExtHBoxAlignEnum.top, ExtVBoxAlignEnum valign = ExtVBoxAlignEnum.left, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, int? flex = null, bool isRoot = true, bool showHeader = true)
//        {
//            //根据布局拼接layout
//            string layoutstring = "";
//            switch (layout)
//            {
//                case ExtLayoutEnum.auto:
//                    layoutstring = "layout: 'auto',";
//                    break;
//                case ExtLayoutEnum.form:
//                    layoutstring = "layout: 'form',";
//                    break;
//                case ExtLayoutEnum.hbox:
//                    layoutstring = "layout : { type : 'hbox', align : '" + Enum.GetName(typeof(ExtHBoxAlignEnum), halign) + "', pack :'" + Enum.GetName(typeof(ExtPackEnum), pack) + "'},";
//                    break;
//                case ExtLayoutEnum.vbox:
//                    layoutstring = "layout : { type : 'vbox', align : '" + Enum.GetName(typeof(ExtVBoxAlignEnum), valign) + "', pack :'" + Enum.GetName(typeof(ExtPackEnum), pack) + "'},";
//                    break;
//                default:
//                    break;
//            }

//            string script = "";

//            if (isRoot == true)
//            {
//                script += "<script>Ext.getCmp('" + (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID + @"').add(";
//            }

//            script += @"Ext.create('Ext.panel.Panel', {
//        " + layoutstring + @"
//        autoScroll: true,
//        collapsible: true,
//        titleCollapse: true,
//        ";
//            script += "header: " + showHeader.ToString().ToLower() + "," + Environment.NewLine;
//            script += "border: " + showHeader.ToString().ToLower() + "," + Environment.NewLine;
//            if (width.HasValue)
//            {
//                script += "width: " + width.Value + "," + Environment.NewLine;
//            }
//            if (height.HasValue)
//            {
//                script += "height: " + height.Value + "," + Environment.NewLine;
//            }
//            if (maxWidth.HasValue)
//            {
//                script += "maxWidth: " + maxWidth.Value + "," + Environment.NewLine;
//            }
//            if (maxHeight.HasValue)
//            {
//                script += "maxHeight: " + maxHeight.Value + "," + Environment.NewLine;
//            }
//            if (flex.HasValue)
//            {
//                script += "flex: " + flex.Value + "," + Environment.NewLine;
//            }
//            script += "hidden: " + (!visible).ToString().ToLower() + "," + Environment.NewLine;
//            script += "collapsed: " + (!expanded).ToString().ToLower() + "," + Environment.NewLine;
//            if (title != null)
//            {
//                script += "title: '" + title.Replace("'", "\\\'") + "'," + Environment.NewLine;
//            }

//            //输出Div和Script，form将会被渲染在div中。 script并没有结束标记，是因为form后面还会拼接各种控件，直到最后using{}结束的时候才会拼上最后的</script>
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            //返回ExtForm
//            ExtPanel rv = new ExtPanel(html.InnerHelper.ViewContext);
//            rv.IsRoot = isRoot;
//            return rv;

//        }

//        /// <summary>
//        /// 开始一个ExtjsPanel
//        /// </summary>
//        /// <typeparam name="TViewModel">VM</typeparam>
//        /// <param name="html">ExtjsHtmlHelper类</param>
//        /// <param name="layout">布局方式</param>
//        /// <param name="pack">开始布局的位置</param>
//        /// <param name="halign">水平布局参数，只在layout=hbox时有效</param>
//        /// <param name="valign">垂直布局参数，只在layout=vbox时有效</param>
//        /// <param name="title">标题</param>
//        /// <param name="height">高度</param>
//        /// <param name="width">宽度</param>
//        /// <param name="expanded">是否展开</param>
//        /// <param name="visible">是否显示</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="isRoot">是否是最上层控件</param>
//        /// <param name="showHeader">是否显示头</param>
//        /// <returns>ExtPanel类</returns>
//        public static ExtPanel BeginTabPanel<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, ExtLayoutEnum layout = ExtLayoutEnum.auto, ExtPackEnum pack = ExtPackEnum.start, ExtHBoxAlignEnum halign = ExtHBoxAlignEnum.top, ExtVBoxAlignEnum valign = ExtVBoxAlignEnum.left, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, int? flex = null, bool isRoot = true, bool showHeader = true)
//        {
//            //根据布局拼接layout
//            string layoutstring = "";
//            switch (layout)
//            {
//                case ExtLayoutEnum.auto:
//                    layoutstring = "layout: 'auto',";
//                    break;
//                case ExtLayoutEnum.form:
//                    layoutstring = "layout: 'form',";
//                    break;
//                case ExtLayoutEnum.hbox:
//                    layoutstring = "layout : { type : 'hbox', align : '" + Enum.GetName(typeof(ExtHBoxAlignEnum), halign) + "', pack :'" + Enum.GetName(typeof(ExtPackEnum), pack) + "'},";
//                    break;
//                case ExtLayoutEnum.vbox:
//                    layoutstring = "layout : { type : 'vbox', align : '" + Enum.GetName(typeof(ExtVBoxAlignEnum), valign) + "', pack :'" + Enum.GetName(typeof(ExtPackEnum), pack) + "'},";
//                    break;
//                default:
//                    break;
//            }

//            string script = "";

//            if (isRoot == true)
//            {
//                script += "<script>Ext.getCmp('" + (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID + @"').add(";
//            }

//            script += @"Ext.create('Ext.tab.Panel', {
//        " + layoutstring + @"
//        autoScroll: false,
//           collapsible: true,
//        titleCollapse: true,
//     ";
//            script += "header: " + showHeader.ToString().ToLower() + "," + Environment.NewLine;
//            script += "plain: " + (!showHeader).ToString().ToLower() + "," + Environment.NewLine;
//            if (width.HasValue)
//            {
//                script += "width: " + width.Value + "," + Environment.NewLine;
//            }
//            if (height.HasValue)
//            {
//                script += "height: " + height.Value + "," + Environment.NewLine;
//            }
//            if (maxWidth.HasValue)
//            {
//                script += "maxWidth: " + maxWidth.Value + "," + Environment.NewLine;
//            }
//            if (maxHeight.HasValue)
//            {
//                script += "maxHeight: " + maxHeight.Value + "," + Environment.NewLine;
//            }
//            if (flex.HasValue)
//            {
//                script += "flex: " + flex.Value + "," + Environment.NewLine;
//            }
//            script += "hidden: " + (!visible).ToString().ToLower() + "," + Environment.NewLine;
//            script += "collapsed: " + (!expanded).ToString().ToLower() + "," + Environment.NewLine;
//            if (title != null)
//            {
//                script += "title: '" + title.Replace("'", "\\\'") + "'," + Environment.NewLine;
//            }

//            //输出Div和Script，form将会被渲染在div中。 script并没有结束标记，是因为form后面还会拼接各种控件，直到最后using{}结束的时候才会拼上最后的</script>
//            html.InnerHelper.ViewContext.Writer.WriteLine(script);
//            //返回ExtForm
//            ExtPanel rv = new ExtPanel(html.InnerHelper.ViewContext);
//            rv.IsRoot = isRoot;
//            return rv;

//        }


//        /// <summary>
//        /// 生成搜索面板控件
//        /// </summary>
//        /// <typeparam name="TViewModel">ViewModel</typeparam>
//        /// <typeparam name="T">继承BasePoco的类</typeparam>
//        /// <typeparam name="V">继承BaseSearcher的类</typeparam>
//        /// <param name="html">LSHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="formID">包含表单ID</param>
//        /// <param name="title">标题</param>
//        /// <param name="height">高度</param>
//        /// <param name="width">宽度</param>
//        /// <param name="expanded">是否展开，默认为是</param>
//        /// <param name="visible">是否可见，默认为是</param>
//        /// <param name="flex">布局填充比例</param>
//        /// <param name="isRoot">是否为最上层控件</param>
//        /// <returns>生成的html</returns>
//        public static MvcHtmlString SearcherPanelFor<TViewModel, T, V>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, BasePagedListVM<T, V>>> fieldExp, string formID = null, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, int? flex = null, bool isRoot = true, bool IsPostBack = false, string url = null, object routeValues = null)
//            where T : BasePoco
//            where V : BaseSearcher
//        {
//            ExtjsSearchPanel obj = new ExtjsSearchPanel();
//            obj.Expanded = expanded;
//            obj.Visible = visible;
//            obj.FormID = formID;
//            obj.Title = title == null ? Resources.Language.搜索条件 : title;
//            obj.Height = height;
//            obj.Width = width;
//            obj.Flex = flex;
//            obj.IsRoot = isRoot;
//            obj.MaxHeight = maxHeight;
//            obj.MaxWidth = maxWidth;
//            obj.IsPostBack = IsPostBack;
//            if (string.IsNullOrWhiteSpace(url))
//            {
//                UrlHelper h = new UrlHelper(html.InnerHelper.ViewContext.RequestContext);
//                url = h.Action(html.InnerHelper.ViewContext.RequestContext.RouteData.Values["action"].ToString(), html.InnerHelper.ViewContext.RequestContext.RouteData.Values["controller"].ToString(), routeValues);
//            }
//            obj.PostUrl = url;
//            obj.BaseViewDivID = (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID.ToString();
//            var rv = html.InnerHelper.EditorFor(fieldExp, "ExtjsSearcherPanel", new { obj = obj });
//            if (isRoot == true)
//            {
//                return rv;
//            }
//            else
//            {
//                html.InnerHelper.ViewContext.Writer.WriteLine(rv);
//                return null;
//            }
//        }

//        /// <summary>
//        /// 生成数据列表控件
//        /// </summary>
//        /// <typeparam name="TViewModel">ViewModel</typeparam>
//        /// <param name="html">LSHtmlHelper类</param>
//        /// <param name="fieldExp">绑定字段的表达式</param>
//        /// <param name="title">标题</param>
//        /// <param name="height">高度</param>
//        /// <param name="width">宽度</param>
//        /// <param name="autoLoad">是否自动读取数据，默认为是</param>
//        /// <param name="expanded">是否展开，默认为是</param>
//        /// <param name="hasCheckBox">是否显示首列的checkbox，默认为是</param>
//        /// <param name="hasNo">是否显示顺序号，默认为否</param>
//        /// <param name="flex">布局比例</param>
//        /// <param name="Visiable">是否可见，默认为是</param>
//        /// <returns>生成的html</returns>
//        public static MvcHtmlString GridFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IBasePagedListVM<BasePoco, BaseSearcher>>> fieldExp, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, bool autoLoad = true, bool hasCheckBox = true, bool hasNo = false, int? flex = null, bool Visiable = true, bool isRoot = true)
//        {
//            var vm = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            //使用ExtjsGrid模版生成控件
//            ExtjsGrid obj = new ExtjsGrid();
//            obj.Expanded = expanded;
//            obj.Height = height;
//            obj.Width = width;
//            obj.Title = title == null ? Resources.Language.数据列表 : title;
//            obj.Visible = Visiable;
//            obj.AutoLoad = autoLoad;
//            obj.Expanded = expanded;
//            obj.Flex = flex;
//            obj.HasCheckBox = hasCheckBox;
//            obj.HasNO = hasNo;
//            obj.MaxWidth = maxWidth;
//            obj.MaxHeight = maxHeight;
//            obj.IsRoot = isRoot;
//            obj.IsPostBack = vm.Searcher.IsPostBack;
//            obj.BaseViewDivID = (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID.ToString();

//            if (vm.UseDataTable == false)
//            {
//                obj.ColumnsJson = vm.GetColumnsJson();
//                obj.FieldsJson = vm.GetFieldsJson();
//            }
//            else
//            {
//                obj.ColumnsJson = vm.GetDataTableColumnsJson();
//                obj.FieldsJson = vm.GetDataTableFieldsJson();
//            }
//            obj.ActionsJson = vm.GetActionsJson();
//            var rv = html.InnerHelper.EditorFor(fieldExp, "ExtjsGrid", new { obj = obj });
//            if (isRoot == true)
//            {
//                return rv;
//            }
//            else
//            {
//                html.InnerHelper.ViewContext.Writer.WriteLine(rv);
//                return null;
//            }
//        }

//        public static MvcHtmlString TreeGridFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IBasePagedListVM<BasePoco, BaseSearcher>>> fieldExp, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool expandAll = false, bool visible = true, bool autoLoad = true, bool hasCheckBox = true, bool hasNo = false, int? flex = null, bool Visiable = true, bool isRoot = true, int start = -1)
//        {
//            var vm = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            //使用ExtjsGrid模版生成控件
//            ExtjsTreeGrid obj = new ExtjsTreeGrid();
//            obj.Expanded = expanded;
//            obj.Height = height;
//            obj.Width = width;
//            obj.Title = title == null ? Resources.Language.数据列表 : title;
//            obj.Visible = Visiable;
//            obj.AutoLoad = autoLoad;
//            obj.Expanded = expanded;
//            obj.Flex = flex;
//            obj.HasCheckBox = hasCheckBox;
//            obj.HasNO = hasNo;
//            obj.MaxWidth = maxWidth;
//            obj.MaxHeight = maxHeight;
//            obj.ColumnsJson = vm.GetColumnsJson();
//            obj.FieldsJson = vm.GetFieldsJson();
//            obj.ActionsJson = vm.GetActionsJson();
//            obj.ExpandAll = expandAll;
//            obj.Start = start;
//            obj.IsRoot = isRoot;
//            obj.IsPostBack = vm.Searcher.IsPostBack;
//            obj.BaseViewDivID = (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID.ToString();
//            var rv = html.InnerHelper.EditorFor(fieldExp, "ExtjsTreeGrid", new { obj = obj });
//            if (isRoot == true)
//            {
//                return rv;
//            }
//            else
//            {
//                html.InnerHelper.ViewContext.Writer.WriteLine(rv);
//                return null;
//            }
//        }


//        public static MvcHtmlString SimpleGridFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IBasePagedListVM<BasePoco, BaseSearcher>>> fieldExp, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, int? flex = null, bool isRoot = true)
//        {
//            var vm = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            //使用ExtjsGrid模版生成控件
//            ExtjsGrid obj = new ExtjsGrid();
//            obj.Height = height;
//            obj.Width = width;
//            obj.Title = title == null ? Resources.Language.数据列表 : title;
//            obj.Flex = flex;
//            obj.MaxWidth = maxWidth;
//            obj.MaxHeight = maxHeight;
//            obj.ColumnsJson = vm.GetColumnsJson();
//            obj.FieldsJson = vm.GetFieldsJson();
//            obj.DataJson = vm.GetDataJson(true);
//            obj.IsRoot = isRoot;
//            obj.BaseViewDivID = (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID.ToString();
//            var rv = html.InnerHelper.EditorFor(fieldExp, "ExtjsGridSimple", new { obj = obj });
//            if (isRoot == true)
//            {
//                return rv;
//            }
//            else
//            {
//                html.InnerHelper.ViewContext.Writer.WriteLine(rv);
//                return null;
//            }
//        }

//        public static MvcHtmlString GroupGridFor<TViewModel>(this ExtjsHtmlHelper<TViewModel> html, Expression<Func<TViewModel, IBasePagedListVM<BasePoco, BaseSearcher>>> fieldExp, string title = null, int? width = null, int? height = null, int? maxWidth = null, int? maxHeight = null, bool expanded = true, bool visible = true, bool autoLoad = true, bool hasCheckBox = true, bool hasNo = false, int? flex = null, bool Visiable = true, bool isRoot = true)
//        {
//            var vm = fieldExp.Compile().Invoke(html.InnerHelper.ViewData.Model);
//            //使用ExtjsGrid模版生成控件
//            ExtjsGrid obj = new ExtjsGrid();
//            obj.Expanded = expanded;
//            obj.Height = height;
//            obj.Width = width;
//            obj.Title = title == null ? Resources.Language.数据列表 : title;
//            obj.Visible = Visiable;
//            obj.AutoLoad = autoLoad;
//            obj.Expanded = expanded;
//            obj.Flex = flex;
//            obj.HasCheckBox = hasCheckBox;
//            obj.HasNO = hasNo;
//            obj.MaxWidth = maxWidth;
//            obj.MaxHeight = maxHeight;
//            obj.IsRoot = isRoot;
//            obj.IsPostBack = vm.Searcher.IsPostBack;
//            obj.BaseViewDivID = (html.InnerHelper.ViewData.Model as BaseVM).ViewDivID.ToString();

//            if (vm.UseDataTable == false)
//            {
//                obj.ColumnsJson = vm.GetColumnsJson();
//                obj.FieldsJson = vm.GetFieldsJson();
//            }
//            else
//            {
//                obj.ColumnsJson = vm.GetDataTableColumnsJson();
//                obj.FieldsJson = vm.GetDataTableFieldsJson();
//            }
//            obj.ActionsJson = vm.GetActionsJson();
//            var rv = html.InnerHelper.EditorFor(fieldExp, "ExtjsGroupGrid", new { obj = obj });
//            if (isRoot == true)
//            {
//                return rv;
//            }
//            else
//            {
//                html.InnerHelper.ViewContext.Writer.WriteLine(rv);
//                return null;
//            }
//        }


//    }
//}
